<?php
git编译安装与常用命令
=========================================
一：编译安装与设置

1.1：简介
    github官网地址（下载源码包）：https://github.com/git/git.git
    git 在 windows mac等系统下载：https://git-scm.com/downloads
    
1.2：依赖关系（解决常见的依赖关系）
    ~]# yum -y install gcc openssl openssl-devel curl curl-devel unzip perl perl-devel expat expat-devel zlib zlib-devel asciidoc xmlto gettext-devel openssh-clients

    ~]# yum -y install openssh-clients
    # ssh-keygen 出现 -bash: ssh: command not found 的解决办法


1.3：编译安装
    方式一：
        ~]# make prefix=/usr/local/git all doc
        ~]# make prefix=/usr/local/git install  install-doc install-html

    方式二：
        ~]# yum -y install autoconf
        ~]# make configure   或者    autoconf
        # 备注：生成 configure 文件
        ~]# ./configure --prefix=/usr/local/git 
        ~]# make all doc
        ~]# make install install-doc install-html

    方式三：
    ~]# yum -y install git      # 安装 git
    ~]# yum -y install git-all.noarch      # 安装 git 所有的包，非必须


1.4：环境配置
    ~]# echo 'export PATH=/usr/local/git/bin:$PATH' > /etc/profile.d/git.sh
    ~]# . /etc/profile.d/git.sh
    ~]# git --version    # 查看版本


1.5：man 文档配置
    ~]# vim /etc/man_db.conf
    MANDATORY_MANPATH           /usr/local/git/share/man

    查看帮助
        格式一：
            ~]# git help init
        格式二：
            ~]# man git-init


1.6：ssh用户，权限，服务器身份认证，初始化仓库 与 拉取仓库
    1：添加用户：
        ~]# useradd git

    2：权限（用户组合用户均为git）：
        /home/git/.ssh      权限为：700
        /home/git/.ssh/authorized_keys  权限为：600
            ~]# mkdir /home/git/.ssh
            ~]# chmod 700 /home/git/.ssh
            ~]# touch /home/git/.ssh/authorized_keys
            ~]# chmod 600 /home/git/.ssh/authorized_keys
            ~]# chown -R git:git /home/git/.ssh 

        # 注意： id_rsa 权限为 600     id_rsa.pub  权限为 644  

    3：服务器身份认证（authorized_keys）（无密码克隆与推送）：
            把本地的公钥 id_rsa.pub 里面的内容加入到 /home/git/.ssh/authorized_keys，一行一个，可以加入多个公钥，git 操作时不再需要密码。
            如果权限设对了，公钥也加入了，还是需要密码等特殊情况，建议 .ssh 目录备份一下，然后删除这个 .ssh 目录重新来过

    4：初始化仓库：（结尾为 .git）
            创建空项目
                ~]# cd /home/git     # 进入git家目录
                ~]# git init --bare useryx.git
                    # 例如 git init --bare 仓库名.git

            项目已有内容
            ~]# git init 
                # cd 进入项目进行初始化
            ~]# git clone --bare 目录名 仓库.git
                # 例如：git clone --bare useryx useryx.git
                # 仓库外面执行

    5：修改仓库用户组为 git
            ~]# chown git:git useryx.git

    6：拉取仓库
            ~]# git clone [ssh://]用户名@地址:仓库名.git
                # 例如：git clone git@192.168.31.73:useryx.git 或者 家目录下的一个文件内如 git clone git@192.168.31.73:/home/git/dir/a.git


1.7：禁止ssh用户登录，可以不用设置。
    ~]# vim /etc/passwd
        # 修改git 用户登录shell
    1：使用linux系统的  /sbin/nologin   不允许登录
        git:x:1001:1001::/home/git:/sbin/nologin
    2：使用git服务 git-shell 的 /usr/local/git/bin/git-shell，which git-shell 查看命令位置。
        git:x:1001:1001::/home/git:/usr/local/git/bin/git-shell



二：客户端初始化配置

2.1：客户端生成公钥与私钥 ssh-keygen（切换至需要生成公钥与私钥的用户）
    ~]# su - git    # 切换至git用户
    ~]# ssh-keygen
        # 使用默认 rsa 算法，2048 长度
    ~]# ssh-keygen -t rsa -b 4096 -C 'git@aliyun.com' -P '3a/Jd3v1wq6M1lrAO+Qc4bCHb2W3SynSTg3CT1GS'
        # -t 指定算法
        # -C  添加一个注释
        # -b 指定加密长度，默认是2048，建议为4096
        # -P 使用加密密码串
            ~]# openssl rand -base64 30      #  30 为生成字符串的长度

    # 使用 ssh-keygen 按照提示操作，也可直接回车。


2.2：设置用户名和邮箱
    ~}# git config --global user.name "用户名"
    ~}# git config --global user.email "邮箱@aliyun.com"


2.3：初始化添加文件夹
    1：创建新版本库（正常流程操作）
        git clone git@192.168.18.35:useryx.git
        cd useryx
        touch README.md
        git add README.md
        git commit -m "add README"
        git push -u origin master

    2：已存在的文件夹或 Git 仓库
        cd useryx
        git init
        git remote add origin git@192.168.18.35:useryx.git
        git add .
        git commit -m '初始化'
        git push -u origin master

2.4：查看默认配置文件
    ~]# git config --list 或者 git config --l

2.5：不更新文件（ .gitgmore）
    ~]#  find ./  -name .gitignore
        # 查找 .gitignore 文件
    ~]# find ./ -name .gitignore -delete
        # 删除 .gitignore 文件

    # 不更新的文件或目录放于此文件中


2.6：本地克隆
    ~]# git clone file://root/test /tmp/test
    ~]# git clone test /tmp/test
        # 本地的 git 项目克隆



三：基础操作

3.1：添加文件（add）
    ~]# git add filename
        # 添加某个文件
    ~]# git add .   或者  git add -A
        # 添加当前目录所有文件


3.2：删除文件（rm）
    ~]# rm                              # 删除文件但不会删除索引
    ~]# git rm -f filename      # 未提交需要 -f 删除
    ~]# git rm filename         # 删除文件并删除索引
    ~]# git rm --cached file    # 删除索引，改变为未追踪状态
    ~]# git cat-file -p hash码   # 查看文件内容


3.3：修改文件（mv）
    ~]# mv                                              # 索引添加新文件，原来的索引会保留。提交时会有错误
    ~]# git mv filename newfilename     # 修改文件同时修改索引

3.4：索引文件添加到快照（commit）
    ~]# git commit -m '注释'
    ~]# git commit -am '注释'             # 添加文件并提交注释

3.5：状态
    ~]# git status

3.6：文件追踪
    已追踪的（tracked）
        ~]# git ls-files
    未追踪的（igored）
        ~]# git ls-files -o
    被忽略的（untracked）：
        查看文件 .gitignore


3.7：提交与拉取
        ~]# git pull
            # 拉取：从远程获取最新版本到本地，不会自动merge
        ~]# git fetch   
            # 拉取：从远程获取最新版本到本地，会自动merge
        ~]# git push origin master
            # 提交：推送本地到远程主分支，


3.8：日志（log）
    ~]# git log
    ~]# git log --oneline
        # 行显示，短格式
    ~]# git log --graph
        # 树型图
    ~]# git log --pretty=oneline --abbrev-commit

3.9：文件比较不同
    ~]# git diff filename1 filename2
            # 比较文件
    ~]# git diff dev
            # 比较当前分支与主分支

3.9：撤销操作（reset）
    1：git reset –mixed <commit id> <filename>：此为默认方式，它回退到某个版本，只保留源码，回退commit和index信息
    2：git reset –soft <commit id> <filename>：只回退 commit 的信息，保留 index ，如果还要提交，直接commit
    3：git reset –hard <commit id> <filename>：彻底回退到某个版本，本地的源码也会变为上一个版本的内容

    HEAD：当前分支的最近提交
    ORIG_HEAD：合并时，新生成的提交保存于此引用中

    HEAD^   回滚前一次，工作目录不受影响

    ^   回退到上一次
    ~<n>  回到几次，等于连续的 HEAD^

    ~]# git reset --hard ORIG_HEAD      # 提交后回退 commit 之前状态


四：分支
3.1：查看与新建分支
        ~]# git branch --all
        ~]# git branch --list

3.:2：创建与切换分支
        ~]# git branch <branch>                             # 创建分支（基于当前分支）
        ~]# git branch <branch> <hsah码>            # 创建分支（基于指定 commit id 分支）
        ~]# git branch bug/first                                # 创建父目录分支（基于当前分支）
        ~]# git branch bug/first  <hsah码>              # 创建父目录分支（基于指定 commit id 分支）

        ~]# git checkout <branch>                   # 切换分支
        ~]# git checkout -b <branch>              # 创建分支时直接切换

3.3：查看分支以及相关的提交
        ~]# git branch                      # 列出分支
        ~]# git branch --list             # 列出分支
        ~]# git show-branch <branch>     # 显示branch分支详细信息

3.4：删除分支
    ~]# git branch -d <branch>
    ~]# git branch -D <branch>      # 强制删除分支
    ~]# git push origin --delete <branch>  # 删除远程分支
    ~]# git push --delete origin <branch>  # 删除远程分支

    # git同步远程已删除的分支和删除本地多余的分支
    ~]# git remote show origin  # 查看本地分支和追踪情况 （固定语句 不加分支）
    # 备注： git remote prune  标识的则为远端已删除，而本地还存在的远端分支
    ~]# git remote prune origin  # 删除本地未追踪的远程分支 （固定语句 不加分支）

3.5：绑定本地分支到远程
    ~]# git push --set-upstream origin dev
        # 本地在 dev 分支上，执行此次操作后在 dev 分支只使用 git push

3.6：比较两个分支差异
    ~]# git diff dev
        # 比较当前分支与 dev 分支的区别

3.5：合并分支
    ~]#  git merge dev
        # 合并 dev 分支到当前分支

3.7：恢复到合并之前
    ~]# git reset --merge    
        # 撤销到合并之前

3.8：查看失败的合并文件信息
        ~]# git ls-files --unmerged
            1：基础版本
            2：我们的版本
            3：他们的版本
        ~]# cat filename（冲突的文件）修改文件内容
            ++<<<<<
            ============
            ++>>>>>>>>>.
        #  修改完成文件后 add 再次提交

3.9：重命名分支
    ~]# git branch -m <branch> <newbranch>   # 重命名本地分支

3.10：推送分支
    ~]# git push origin <branch>  # 推送本地分支到远程


五：打标签
5.1：tag介绍
    git 有 commit，commit号是一串字符不便于查找，而 tag 的作用是更加清晰明了。
    把完整的项目提交到 tag 标签，就可以实现版本的持续发布。

5.2：创建标签
    ~]# git tag <name>

5.3：查看标签
    ~]# git tag
    ~]# git show <tag name>   # 可以查看到commit id

5.4：对 commit id 打标签
    ~]# git tag <tag name> <commit id>
    ~]# git tag -a <tag name> -m "注释信息" <commit id>

5.5：删除标签
    ~]# git tag -d <tagname>        # 本地标签
    ~]# git push origin :refs/tags/<tagname>    # 远程标签

5.6：推送标签
    ~]# git push origin <tagname>  推送指定的
    ~]# git push origin --tags   # 推送全部



六：常见问题解决办法

6.1：git status 查看状态时中文乱码
    git config --global core.quotepath false

    git log 中文乱码
    --注释：该命令表示提交命令的时候使用utf-8编码集提交
    git config --global i18n.commitencoding utf-8  
    --注释：该命令表示日志输出时使用utf-8编码集显示
    git config --global i18n.logoutputencoding utf-8 
    --注释：设置LESS字符集为utf-8
    export LESSCHARSET=utf-8  

6.2：文件权限引起的冲突（文件显示被修改）（低版本git一般会出现此问题）
    git config --global core.filemode false

6.3：关于windows 与 Linux 软连接问题
    windows 软连接 与 Linux 软连接不通用
    windows 软连接 git 提交后会软连直接替换为目标文件
<<<<<<< HEAD
    ~]# 
    Linux 软连接 git 提交后软连接不会被替换，依然是软连接
    ~]#  find ./ -type l
=======
    Linux 软连接 git 提交后软连接不会被替换，依然是软连接

6.4： git 换行符处理问题
        Unix或类Unix操作系统的换行符叫做LF，而windows系统的叫做CRLF

        推荐博客： https://blog.csdn.net/github_30605157/article/details/56680990
    
    ~]# git config --global core.autocrlf true



七：杂项
    vim命令修改全局配置
    ~]# git config --global --edit
>>>>>>> bf9f522caa3d1b79c8a8c15fc3c9da0d355c9408
